home *** CD-ROM | disk | FTP | other *** search
- *
- * serial (ProNET driver)
- *
-
- ** This driver does not work correctly with 8n1.device 37.13
-
- ; Format of one packet
- ; 2bytes "R!" for packet recognization
- ; 2bytes Length in Bytes of pure data without next two words
- ; 2bytes Destination Port
- ; 2bytes source Port
- ; xbytes Data
-
- include "A:OSmacros.i"
- include "exec/exec.i"
- include "devices/serial.i"
- include "P:include/devices/pronet.i"
- include "exec_lib.i"
-
- Init
- movem.l d2-d7/a2-a6,-(sp)
- move.l a0,a4
- move.l a1,a5
- cmp.l #"RST!",d0 ;compare ID
- bne .ende
- cmp.l #2,d1 ;0 was the error condition
- bne.s .ende ;in ProNET V2/V3
-
- bsr StartDevice
- tst.w d0
- beq.s .ende
-
- move.l serialio(pc),a0
- move.l MN_REPLYPORT(a0),a0
- move.b MP_SIGBIT(a0),pndd_ReadSignalBit(a4)
- move.l #ReadQuery,pndd_ReadQuery(a4)
- move.l #ReadFlush,pndd_ReadFlush(a4)
- move.l #Read,pndd_Read(a4)
- move.l #Write,pndd_Write(a4)
- move.l #Exit,pndd_Exit(a4)
-
- clr.l RC
-
- .ende movem.l (sp)+,d2-d7/a2-a6
- move.l RC(pc),d0
- rts
-
- RC dc.l 0
-
- dc.b "$VER: serial 37.0 (30.11.96)",13,10,0
- even
-
- Exit movem.l d2-d7/a2-a6,-(sp)
- bsr StopDevice
- movem.l (sp)+,d2-d7/a2-a6
- rts
-
- ; -- Start the right `serial.device'
- StartDevice move.l 4.w,a6
-
- move.l #PNDRVERR_NO_MEMORY,RC
- moveq #IOEXTSER_SIZE,d0
- bsr GetIORequest
- move.l d0,serialio
- beq noiorequest
-
- moveq #IOEXTSER_SIZE,d0
- bsr GetIORequest
- move.l d0,serialiow
- beq noiorequest2
-
- move.l serialio(pc),a2
- move.b #SERF_7WIRE,IO_SERFLAGS(a2)
- move.l a5,a0 ;device name
- .0 move.b (a0)+,d0
- cmp.b #" ",d0
- bhi.s .0
- clr.b -1(a0)
-
- bsr dec2long
- move.l d1,d5 ;unit
- bsr dec2long
- move.l d1,d6 ;baudrate
-
- move.b #SERF_XDISABLED^SERF_RAD_BOOGIE^SERF_7WIRE,d7
- lea threeweestring(pc),a1
- tst.b -1(a0)
- beq.s .7wire ;3 or 7 wire??
- moveq #4,d0
- .test3wire move.b (a0)+,d1
- cmp.b #"A",d1
- bcs.s .nochar
- bclr #5,d1
- .nochar cmp.b (a1)+,d1
- dbne d0,.test3wire
- bne.s .7wire
- bclr #SERB_7WIRE,d7
- bclr #SERB_7WIRE,IO_SERFLAGS(a2)
- .7wire
- move.l a5,a0
- move.l d5,d0
- move.l a2,a1
- moveq #0,d1
- LIBCALL OpenDevice
- move.l #err1,RC
- tst.b d0
- bne nodevice
-
- move.l a2,a0
- move.l serialiow(pc),a1
- move.l a1,a2
- move.l MN_REPLYPORT(a2),d2
- moveq #IOEXTSER_SIZE,d0
- LIBCALL CopyMem
- move.l d2,MN_REPLYPORT(a2)
- move.w #CMD_WRITE,IO_COMMAND(a2)
-
- move.l serialio(pc),a1
- move.w #SDCMD_SETPARAMS,IO_COMMAND(a1)
- move.b d7,IO_SERFLAGS(a1)
- move.l d6,IO_BAUD(a1)
- move.l #16384,IO_RBUFLEN(a1)
- clr.l IO_EXTFLAGS(a1)
- move.b #8,IO_READLEN(a1)
- move.b #8,IO_WRITELEN(a1)
- move.b #1,IO_STOPBITS(a1)
- clr.b IO_FLAGS(a1)
- LIBCALL DoIO
- move.l #err2,RC
- tst.b d0
- bne.s noparams
-
- bsr.s IssueReadCMD
- moveq #-1,d0
- rts
-
- err1 dc.b "Can't open specified serial.device.",0
- err2 dc.b "Couldn't set serial parameters.",0
- even
-
- StopDevice move.l 4.w,a6
- move.l serialio(pc),a1
- LIBCALL AbortIO
- move.l serialio(pc),a1
- LIBCALL WaitIO
- noparams move.l serialio(pc),a1
- LIBCALL CloseDevice
- nodevice move.l serialiow(pc),a0
- bsr FreeIORequest
- noiorequest2 move.l serialio(pc),a0
- bsr FreeIORequest
- noiorequest moveq #0,d0
- rts
-
- threeweestring dc.b "3WIRE"
- even
-
- ; -- Put Out An 8 Bytes Read Command
- IssueReadCMD move.l serialio(pc),a0
- move.l MN_REPLYPORT(a0),a0
- move.b MP_SIGBIT(a0),d2
- moveq #0,d0
- moveq #0,d1
- bset d2,d1
- LIBCALL SetSignal
- move.l serialio(pc),a1
- move.w #CMD_READ,IO_COMMAND(a1)
- clr.b IO_FLAGS(a1)
- move.l #buffer,IO_DATA(a1)
- move.l #8,IO_LENGTH(a1)
- move.l 4.w,a6
- LIBJMP SendIO
-
- ReadQuery
- movem.l d3-d7/a2-a6,-(sp)
- move.l serialio(pc),a0
- move.l MN_REPLYPORT(a0),a0
- move.l 4.w,a6
- LIBCALL GetMsg
- tst.l d0
- beq.s .nope
- move.w buffer(pc),d0
- cmp.w #"R!",d0
- beq.s .ok0
-
- bsr ReadEmpty
- bsr IssueReadCMD
- .nope moveq #0,d0
- bra.s .ende
-
- .ok0 movem.w buffer+2(pc),d0-d2
- .ende movem.l (sp)+,d3-d7/a2-a6
- rts
-
- ReadFlush
- movem.l d2-d7/a2-a6,-(sp)
- move.l 4.w,a6
- moveq #0,d2
- move.w buffer+2(pc),d2
- .1 move.l d2,d0
- cmp.l #64,d0
- bls.s .0
- moveq #64,d0
- .0 sub.l d0,d2
- move.l serialio(pc),a1
- move.l #clrbuffer,IO_DATA(a1)
- move.l d0,IO_LENGTH(a1)
- move.w #CMD_READ,IO_COMMAND(a2)
- clr.b IO_FLAGS(a1)
- LIBCALL DoIO
- tst.l d2
- bne.s .1
- bra.s read_entry
-
- Read
- movem.l d2-d7/a2-a6,-(sp)
- move.l 4.w,a6
- move.l serialio(pc),a1
- move.l a0,IO_DATA(a1)
- moveq #0,d0
- move.w buffer+2(pc),d0
- move.l d0,IO_LENGTH(a1)
- move.w #CMD_READ,IO_COMMAND(a1)
- clr.b IO_FLAGS(a1)
- LIBCALL DoIO
- read_entry bsr IssueReadCMD
- movem.l (sp)+,d2-d7/a2-a6
- rts
-
- Write
- movem.l d2-d7/a2-a6,-(sp)
- move.l serialiow(pc),a2
- move.l 4.w,a6
-
- move.l a0,a3
- move.l d0,d3
-
- lea sendbuffer(pc),a5
- move.w d0,2(a5)
- move.w d1,4(a5)
- move.w d2,6(a5)
- move.l a5,IO_DATA(a2)
- move.l #8,IO_LENGTH(a2)
- clr.b IO_FLAGS(a2)
- move.l a2,a1
- LIBCALL DoIO
-
- move.l a3,IO_DATA(a2)
- move.l d3,IO_LENGTH(a2)
- clr.b IO_FLAGS(a2)
- move.l a2,a1
- LIBCALL DoIO
-
- moveq #0,d0
- movem.l (sp)+,d2-d7/a2-a6
- rts
-
- buffer ds.b 8
-
- sendbuffer dc.b "R!"
- dc.w 0,0,0
-
- ; -- A received message did not contain the "R!" string (probably
- ; -- the BaudBandit.device startup message), so clear it!
- ReadEmpty move.l serialio(pc),a2 * CMD_CLEAR
- move.l 4.w,a6 * does not help!
- .loop move.w #SDCMD_QUERY,IO_COMMAND(a2) * so we have to read
- move.l a2,a1 * it out!
- clr.b IO_FLAGS(a1)
- LIBCALL DoIO
- move.l IO_ACTUAL(a2),d0
- beq.s .ende
- cmp.l #64,d0
- bcs.s .ok0
- moveq #64,d0
- .ok0 move.l d0,IO_LENGTH(a2)
- move.l #clrbuffer,IO_DATA(a2)
- move.w #CMD_READ,IO_COMMAND(a2)
- move.l a2,a1
- clr.b IO_FLAGS(a1)
- LIBCALL DoIO
- bra.s .loop
- .ende rts
-
-
- dec2long ; konvertiert Dezimalstring ab (a0) zu Longword in D1 !!
- moveq #0,d1
- .loop moveq #0,d0
- move.b (a0)+,d0
- sub.b #"0",d0
- cmp.b #9,d0
- bhi.s .oki
- move.l d1,d2
- lsl.l #3,d1
- add.l d2,d1
- add.l d2,d1
- add.l d0,d1
- bra.s .loop
- .oki rts
-
- serialio dc.l 0
- serialiow dc.l 0
-
-
- include "P:include/devio.s"
-
- section b,bss
-
- clrbuffer ds.b 64
-